#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/kthread.h>
#include <linux/skbuff.h>
#include <linux/semaphore.h>

#include "myFunc.h"

struct task_struct *practice_task_p = NULL, *practice_task_p1 = NULL;
struct semaphore skb_num;
int my_kernel_thread(void *arg)
{
  int n = 0;

  while (1)
  {
    printk("%s: %d\n", __func__, n++);
    ssleep(3);
    if (kthread_should_stop())
    {
      break;
    }
  }

  return 0;
}

int add_port(void *arg)
{
  printk("---------------------------------------------探测包发送线程启动");
  test();
  // int i = 0;
  // for (; i < 100; i++)
  // {
  //   unsigned short p = 123 + i;
  //   enqueue(p);
  //   // if(i==22)
  //   usleep_range(3, 5);
  //   printk("add一个后：queueLength:%d", getqueueLength());
  //   up(&skb_num);
  // }
  printk("---------------------------------------------探测包发送线程结束");
  return 0;
}
int remove_port(void *arg)
{
  printk("---------------------------------------------数据包发送线程启动");
  sendData();
  // int i = 0;
  // for (; i < 100; i++)
  // {
  //   down_interruptible(&skb_num);
  //   dequeue();
  //   printk("remove一个后：queueLength:%d", getqueueLength());
  // }
  printk("---------------------------------------------数据包发送线程结束");
  return 0;
}

// void test_skb_queue(void)
// {
//   initqueue();
//   // if(head->next==NULL) printk("init 后head->next==NULL");
//   struct sk_buff a, b;
//   enqueue(&a);
//   enqueue(&b);
//   printk("queueLength:%d", getqueueLength());
//   if (&a == dequeue())
//     printk("yes");
//   if (&b == dequeue())
//     printk("yes");
//   printk("queueLength:%d", getqueueLength());
//   if (dequeue() == NULL)
//     printk("----yes");
//   printk("queueLength:%d", getqueueLength());
//   printk("----------------------------------------");
// }
static int __init hello_init(void)
{

  // test();
  // printk("queueLength:%d", getqueueLength());
  // sendData();
  // printk("queueLength:%d", getqueueLength());
  // printk("--------------------------");
  // sema_init(&skb_num, 0);
  // initqueue();
  // printk("%s:\n", __func__);
  printk("---------------------------------------------myFunc.ko主线程启动");
  practice_task_p = kthread_create(remove_port, NULL, "practice task");
  if (!IS_ERR(practice_task_p))
    wake_up_process(practice_task_p);

  practice_task_p1 = kthread_create(add_port, NULL, "practice task");
  if (!IS_ERR(practice_task_p1))
    wake_up_process(practice_task_p1);

  printk("queueLength:%d", getqueueLength());
  printk("--------------------------");
  printk("--------------------------");
  printk("--------------------------");
  printk("---------------------------------------------myFunc.ko主线程结束");

  // remove_skb("lllllllllll");
  // int i=0;
  // for(i=0;i<10;i++)
  // {
  //   ssleep(1);
  // }
  //test_skb_queue();

  return 0;
}

static void __exit hello_exit(void)
{
  // printk(KERN_EMERG "bye ,see you \n");
  // printk("%s:\n", __func__);
  // kthread_stop(practice_task_p);
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_VERSION("1.0");
